package br.unifor.ads.desphouse.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import br.unifor.ads.desphouse.entity.Lancamento;
import br.unifor.ads.desphouse.entity.LancamentoTipo;
import br.unifor.ads.desphouse.entity.Usuario;

/**
 * 
 * @author Arley
 */
public class LancamentoDAO {

	private EntityManager em = new EntityManager() {
		
		public Object trataResultSet(ResultSet resultSet) throws SQLException {
			Lancamento lancamento = new Lancamento();
			lancamento.setCodigo(resultSet.getLong("codigo"));
			lancamento.setDescricao(resultSet.getString("descricao"));
			lancamento.setEntrada(resultSet.getBoolean("entrada"));
			lancamento.setData(resultSet.getDate("data"));
			//lancamento_tipo
			LancamentoTipo lancamentoTipo = new LancamentoTipo();
			lancamentoTipo.setCodigo(resultSet.getLong("lancamento_tipo_codigo"));
			lancamento.setLancamentoTipo(lancamentoTipo);
			//usuario
			Usuario usuario = new  Usuario();
			usuario.setCodigo(resultSet.getLong("usuario_codigo"));
			lancamento.setUsuario(usuario);
			//retornando objeto
			return lancamento;
		}
	};
	public Lancamento salvar(Lancamento lancamento) throws SQLException {
		String sql = 
				"insert into financeiro.lancamento "
				+ "(descricao,entrada,data,lancamento_tipo_codigo,usuario_codigo)"
				+ " values "
				+ "(?, ?, ?, ?, ?)"
				+ "returning codigo,descricao,data,entrada,lancamento_tipo_codigo,usuario_codigo";
		return (Lancamento) em.getSingleResult(sql, 
				lancamento.getDescricao(), lancamento.getEntrada(), 
				new java.sql.Date(lancamento.getData().getTime()),
				lancamento.getLancamentoTipo().getCodigo(),
				lancamento.getUsuario().getCodigo());
	}

	public void atualizar(Lancamento lancamento) throws SQLException {
		  String sql = "update financeiro.lancamento set "
		    + "descricao = ?, entrada = ?, data = ?, lancamento_tipo_codigo = ?, usuario_codigo = ? "
		    + "where codigo = ?";
		  em.executeQuery(sql, 
		    lancamento.getDescricao(),lancamento.getEntrada(), 
		    new java.sql.Date(lancamento.getData().getTime()),
		    lancamento.getLancamentoTipo().getCodigo(),
		    lancamento.getUsuario().getCodigo(),
		    lancamento.getCodigo());
		 }

	public void excluirPorCodigo(Long codigo) throws SQLException {
		String sql = "delete from financeiro.lancamento where codigo = ?";
		em.executeQuery(sql, codigo);
	}

	public void excluirTodos() throws SQLException {
		String sql = "delete from financeiro.lancamento";
		em.executeQuery(sql);
	}

	public Lancamento buscarPorCodigo(Long codigo) throws SQLException {
		String sql = "select "
				+ "codigo, descricao, entrada, data, lancamento_tipo_codigo,usuario_codigo "
				+ "from financeiro.lancamento where codigo = ?";
		return (Lancamento) em.getSingleResult(sql, codigo);
	}

	@SuppressWarnings("unchecked")
	public List<Lancamento> buscarTodos() throws SQLException {
		String sql = "select "
				+ "codigo, descricao, entrada, data, lancamento_tipo_codigo, usuario_codigo "
				+ "from financeiro.lancamento";
		return (List<Lancamento>) em.getResultList(sql);
	}

	/**
	 * Verifica se existe alguma lancamento
	 * com o Tipo informado
	 * 
	 * @param codigo
	 */
	@SuppressWarnings("unchecked")
	public List<Lancamento> buscarPorTipoLancamento(Long codigo) throws SQLException{
		String sql = "select "
				+ "codigo, descricao, entrada, data, lancamento_tipo_codigo,usuario_codigo "
				+ "from financeiro.lancamento where lancamento_tipo_codigo = ?";
		return (List<Lancamento>) em.getResultList(sql, codigo);
		
	}

}
